package com.hz.ruoyifarmbase.farm.utils;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * @author zjk
 * @date 2025/3/8 11:07
 * @description:计算采收日期范围工具类
 */
public class HarvestDateCalculator {

    /**
     * 计算采收日期范围
     *
     * @param text        包含天数范围的字符串（如 "从播种到采收一般需要35-45天左右"）
     * @param startDateStr 起始日期字符串（如 "2025-01-01"）
     * @return 包含最早采收日期、最晚采收日期和折中采收日期的数组
     */
    public static LocalDate[] calculateHarvestDates(String text, String startDateStr) {
        // 提取天数范围
        int[] daysRange = extractDaysRange(text);

        if (daysRange == null) {
            throw new IllegalArgumentException("未找到天数范围");
        }

        // 解析起始日期
        LocalDate startDate = LocalDate.parse(startDateStr, DateTimeFormatter.ISO_LOCAL_DATE);

        // 计算采收日期范围
        LocalDate minHarvestDate = startDate.plusDays(daysRange[0]);
        LocalDate maxHarvestDate = startDate.plusDays(daysRange[1]);

        // 计算折中日期
        LocalDate averageHarvestDate = calculateAverageDate(minHarvestDate, maxHarvestDate);

        // 返回结果
        return new LocalDate[]{minHarvestDate, maxHarvestDate, averageHarvestDate};
    }

    /**
     * 提取字符串中的天数范围
     *
     * @param str 包含天数范围的字符串
     * @return 包含最小天数和最大天数的数组
     */
    private static int[] extractDaysRange(String str) {
        // 正则表达式：匹配数字范围（如 35-45 或 35到45）
        Pattern pattern = Pattern.compile("(\\d+)[到-](\\d+)");
        Matcher matcher = pattern.matcher(str);

        if (matcher.find()) {
            int minDays = Integer.parseInt(matcher.group(1)); // 提取最小天数
            int maxDays = Integer.parseInt(matcher.group(2)); // 提取最大天数
            return new int[]{minDays, maxDays};
        }

        return null; // 如果未找到匹配，返回 null
    }

    /**
     * 计算两个日期的中间日期
     *
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 中间日期
     */
    private static LocalDate calculateAverageDate(LocalDate date1, LocalDate date2) {
        // 计算两个日期之间的天数差
        long daysBetween = ChronoUnit.DAYS.between(date1, date2);

        // 计算中间日期
        return date1.plusDays(daysBetween / 2);
    }
//    public static void main(String[] args) {
//        String text = "从播种到采收一般需要35-45天左右";
//        String startDateStr = "2025-01-01";
//
//        try {
//            // 调用工具类计算采收日期
//            LocalDate[] harvestDates = HarvestDateCalculator.calculateHarvestDates(text, startDateStr);
//
//            // 输出结果
//            System.out.println("最早采收日期: " + harvestDates[0]);
//            System.out.println("最晚采收日期: " + harvestDates[1]);
//            System.out.println("折中采收日期: " + harvestDates[2]);
//        } catch (IllegalArgumentException e) {
//            System.out.println(e.getMessage());
//        }
//    }
}


